package com.study.reflect.demo.annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

import org.junit.Test;

/**
* @Name: AnnotationReflectParse
* @Description: 注解解析类：对刚才定义的ORM注解进行解析，实现类到表的映射
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-19 上午11:13:10 
* @Version: V1.0
 */
public class AnnotationReflectParse {
	
	/**
	* @Name: annotationParse01
	* @Description: 注解解析测试一：获取指定类的类上的所有有效注解及属性上的所有有效注解
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-19 上午11:17:28
	* @Parameters: @param classPath 类的包路径（包含类名）
	* @Return: void 无
	 */
	public void annotationParse01(String classPath) throws Exception {
		//创建类的字节码文件对象
		Class clazz = Class.forName(classPath) ;
		//获取类上所有有效注解的注解对象数组
		Annotation[] classAnnotations = clazz.getDeclaredAnnotations() ;
		for (Annotation annotation : classAnnotations) {
			System.out.println(annotation);
		}
		//获取类中所有属性的属性对象数组
		Field[] fields = clazz.getDeclaredFields() ;
		for (Field field : fields) {
			//取消权限访问检查
			field.setAccessible(true) ;
			//获取属性上所有有效注解的注解对象数组
			Annotation[] fieldAnnotations = field.getDeclaredAnnotations() ;
			for (Annotation annotation : fieldAnnotations) {
				System.out.println(annotation);
			}
			
		}
	}
	
	/**
	* @Name: annotationParse02
	* @Description: 注解解析测试二：获取指定类及类属性上的具体有效注解，并实现类到表的映射
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-19 上午11:31:32
	* @Parameters: @param classPath
	* @Return: void
	 */
	public void annotationParse02(String classPath) throws Exception {
		//获取类的字节码文件对象
		Class clazz = Class.forName(classPath) ;
		//获取类上的有效注解对象
		TableAnnotation tableAnnotation = (TableAnnotation) clazz.getAnnotation(TableAnnotation.class) ;
		System.out.println(tableAnnotation.value());
		//获取类属性上的有效注解对象
		//获取类所有属性的属性对象数组
		Field[] fields = clazz.getDeclaredFields() ;
		for (Field field : fields) {
			//取消权限访问检查
			field.setAccessible(true) ;
			//获取每一个属性上的有效注解对象
			FieldAnnotation fieldAnnotation = (FieldAnnotation) field.getAnnotation(FieldAnnotation.class) ;
			System.out.print(fieldAnnotation.name() + "----");
			System.out.print(fieldAnnotation.type() + "----");
			System.out.println(fieldAnnotation.length());
			System.out.println("=============================");
		}
		//根据获取到的表名称和表字段名称、类型及长度信息，使用JDBC，拼接sql语句，创建对应的表结构，省略
	}
	
	@Test
	public void test() throws Exception{
		String classPath = "com.study.annotation.example.Student" ;
		annotationParse02(classPath) ;
	}
	

}
